﻿
using System;
using System.Collections.Generic;

namespace Configurator
{   
    /// <summary>
    /// Конфигуратор элементов.
    /// </summary>
    public class Configurator
    {
        /// <summary>
        /// Список элементов конфигурации.
        /// </summary>
        private List<Item> items;

        /// <summary>
        /// Инициализирует конфигуратор.
        /// </summary>
        public Configurator()
        {
            this.items = new List<Item>();
        }

        /// <summary>
        /// Возвращает или задает список элементов конфигурации.
        /// </summary>
        public List<Item> Items
        {
            get { return this.items; }
            set { this.items = value; }
        }

        /// <summary>
        /// Добавление элемент в список конфигурации.
        /// </summary>
        /// <param name="newItem">Добавляемый элемент.</param>
        /// <returns>Возвращает true, если элемент успешно добавлен, иначе - false.</returns>
        public bool AddItem(Item newItem)
        {
            if (this.items.Contains(newItem))
            {
                return false;
            }

            this.items.Add(newItem);

            return true;
        }

        /// <summary>
        /// Вовзращает элемент по заданному имени.
        /// </summary>
        /// <param name="name">Имя элемента.</param>
        /// <returns>Возвращает элемент если он существует, null если его нет.</returns>
        public Item GetItemWithName(string name)
        {
            if (string.Empty == name)
            {
                throw new ArgumentException("Имя элемента не может быть пустым.");
            }

            for (int i = 0; i < this.Items.Count; ++i)
            {
                if (name == this.items[i].Name)
                {
                    return this.items[i];
                }
            }

            return null;
        }

        /// <summary>
        /// Удаляет указанный элемент из конфигурации.
        /// </summary>
        /// <param name="item">Удаляемый элемент.</param>
        /// <returns>Возвращает true, если элемент удален, иначе - false.</returns>
        public bool RemoveItem(Item item)
        {
            if (null == item)
            {
                throw new ArgumentNullException("Удаляемый элемент = null.");
            }

            return this.Items.Remove(item);
        }

        /// <summary>
        /// Сортирует элементы по имени.
        /// </summary>
        public void SortItem()
        {
            this.items.Sort((a, b) => a.Name.CompareTo(b.Name));
        }

        /// <summary>
        /// Сортирует все подэлементы в элементах по имени.
        /// </summary>
        public void SortAllSubItem()
        {
            for (int i = 0; i < this.items.Count; i++)
            {
                this.items[i].SortSubItem();
            }
        }
    }
}
